// internal/models/role.go
package models

import (
	"database/sql/driver"
	"encoding/json"
	"errors"
	"star-go-app/internal/domain/entities/base_model"
)

// Permissions 权限类型 - 使用字符串切片存储权限
// 注意：由于需要同时实现sql.Scanner和driver.Valuer接口，
// 这里混合使用了指针接收器和值接收器
type Permissions []string

func (p *Permissions) Scan(value any) error {
	bytes, ok := value.([]byte)
	if !ok {
		return errors.New("类型断言为[]byte失败")
	}

	return json.Unmarshal(bytes, p)
}

// 实现driver.Valuer接口，用于向数据库写入数据
func (p Permissions) Value() (driver.Value, error) {
	return json.Marshal(p)
}

// Role 角色模型
type Role struct {
	base_model.BaseModel
	Name        string      `gorm:"size:50;uniqueIndex;not null" json:"name"` // 角色名称
	Code        string      `gorm:"size:50;uniqueIndex;not null" json:"code"` // 角色编码
	Description string      `gorm:"size:200" json:"description"`              // 角色描述
	Permissions Permissions `gorm:"type:json" json:"permissions"`             // 角色权限
}

// TableName 表名
func (Role) TableName() string {
	return "star_roles"
}

// 预定义角色
var (
	// AdminRole 管理员角色 - 拥有所有权限
	AdminRole = &Role{
		Name:        "管理员",
		Code:        RoleAdmin,
		Description: "系统管理员，拥有所有权限",
		Permissions: Permissions{"*"},
	}

	// UserRole 普通用户角色 - 拥有基本权限
	UserRole = &Role{
		Name:        "普通用户",
		Code:        RoleUser,
		Description: "普通用户，拥有基本权限",
		Permissions: Permissions{
			"user:view",
			"user:edit",
			"content:view",
			"content:create",
			"content:edit",
		},
	}

	// GuestRole 访客角色 - 仅拥有查看权限
	GuestRole = &Role{
		Name:        "访客",
		Code:        RoleGuest,
		Description: "访客，仅拥有查看权限",
		Permissions: Permissions{
			"user:view",
			"content:view",
		},
	}
)

// GetPredefinedRole 根据角色编码获取预定义角色
func GetPredefinedRole(code string) *Role {
	switch code {
	case RoleAdmin:
		return AdminRole
	case RoleUser:
		return UserRole
	case RoleGuest:
		return GuestRole
	default:
		return nil
	}
}

// 权限常量
const (
	// PermAll 全部权限
	PermAll = "*" // 所有权限
)
